package com.excilys.formation.project.controllers.formdata;

import javax.validation.constraints.Min;
import javax.validation.constraints.NotNull;

import org.hibernate.validator.constraints.Length;
import org.hibernate.validator.constraints.NotEmpty;
import org.joda.time.DateTime;

import com.excilys.formation.project.entities.Compte;

/**
 * Classe pour contenir les données des virements dans les requètes.
 * 
 * @author excilys
 * 
 */
public class VirementData implements Comparable<VirementData> {
	/**
	 * Numéro du compte émetteur.
	 */
	private String emetteur;
	/**
	 * Numéro du compte récepteur.
	 */
	private String recepteur;
	/**
	 * Montant du virement.
	 */
	private double montant;

	/**
	 * Montant du virement.
	 */
	private DateTime date;

	public VirementData() {
		super();
	}

	public VirementData(String emetteur, String recepteur, double montant, DateTime date) {
		super();
		this.emetteur = emetteur;
		this.recepteur = recepteur;
		this.montant = montant;
		this.date = date;
	}

	/**
	 * Renvoie le numéro du compte émetteur.
	 * 
	 * @return emetteur
	 */
	@NotEmpty
	@Length(min = Compte.TAILLE_NUMERO, max = Compte.TAILLE_NUMERO)
	public String getEmetteur() {
		return emetteur;
	}

	/**
	 * Met à jour le numéro du compte émetteur.
	 * 
	 * @param emetteur
	 *            nouveau numéro du compte émetteur
	 */
	public void setEmetteur(String emetteur) {
		this.emetteur = emetteur;
	}

	/**
	 * Renvoie le numéro du compte récepteur.
	 * 
	 * @return recepteur
	 */
	@NotNull
	@Length(min = Compte.TAILLE_NUMERO, max = Compte.TAILLE_NUMERO, message = "Format de compte invalide.")
	public String getRecepteur() {
		return recepteur;
	}

	/**
	 * Met à jour le numéro du compte récepteur.
	 * 
	 * @param recepteur
	 *            le nouveau numéro du compte récepteur.
	 */
	public void setRecepteur(String recepteur) {
		this.recepteur = recepteur;
	}

	/**
	 * Renvoie le montant du virement.
	 * 
	 * @return le montant du virement.
	 */
	@Min(value = 1, message = "Montant minimum : 1€")
	public double getMontant() {
		return montant;
	}

	/**
	 * Met à jour le montant du virement.
	 * 
	 * @param montant
	 *            le nouveau montant du virement.
	 */
	public void setMontant(double montant) {
		this.montant = montant;
	}

	/**
	 * Met à jour le montant du virement à partir d'une chaine de charactères.
	 * 
	 * @param sMontant
	 *            le nouveau montant du virement.
	 */
	public void setMontant(@NotEmpty String sMontant) {
		this.montant = Double.parseDouble(sMontant);
	}

	/**
	 * Renvoie la date du virement.
	 * 
	 * @return la date du virement.
	 */
	public DateTime getDate() {
		return date;
	}

	/**
	 * Met à jour la date du virement.
	 * 
	 * @param date
	 *            la nouvelle date du virement.
	 */
	public void setDate(DateTime date) {
		this.date = date;
	}

	@Override
	public int compareTo(VirementData o) {
		return this.date.compareTo(o.date);
	}
}
